package net.suplementos.web.action;

import java.util.List;

import net.suplementos.negocio.FinanceiroDelegate;
import net.suplementos.pojo.Atendimento;
import net.suplementos.pojo.Cliente;
import net.suplementos.pojo.Produto;
import net.suplementos.servico.FinanceiroServico;
import net.suplementos.web.LocalConstantes;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ExceptionMapping;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

@Namespace("/realizarAtendimento")
@InterceptorRefs({
	@InterceptorRef(value = "store", params = {"operationMode", "AUTOMATIC"}),
	@InterceptorRef("defaultStack")
})
public class RealizarAtendimentoAction extends ActionSupport {
	
	private Atendimento atendimento;
	private Produto produto;
	private Cliente cliente;
	private List<Atendimento> resultadoConsulta;
	private List<Produto> listaProdutoAtendimento;
	private FinanceiroServico financeiroServico = FinanceiroDelegate.getInstance();
	private int quantidade;
	private String origem = "";

	private static final String FORWARD_ALTERAR_ATENDIMENTO = "alterarAtendimento";
	
    private static final String NOME_ENTIDADE_SINGULAR = "Realizar Atendimento";

    @Action(value = "consultar", results = {
    		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_ATENDIMENTO + "/listar.jsp"),
    		@Result(name = INPUT, params = {"actionName", "abrirConsultar"}, type = "redirectAction")
    	}, exceptionMappings = {
    		@ExceptionMapping(exception = "net.suplementos.exception.NegocioException", result = INPUT)
    	})
	public String listarAtendimentosEmAberto() throws Exception {
		setResultadoConsulta(financeiroServico.listarAtendimentosRealizados());
		
		if (getResultadoConsulta() == null || getResultadoConsulta().isEmpty()) {
			addActionError(getText("geral.mensagem.consulta.sem.retorno"));
			return INPUT;
		}

		return SUCCESS;
	}

	@Action(value = "atendimento", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_ATENDIMENTO + "/listar.jsp") 
	})
	public String atendimento() throws Exception {
		return SUCCESS;
	}
	
	@Action(value = "finalizar", results = {
		@Result(name = SUCCESS, params = {"actionName", "atendimento"}, type = "redirectAction")
	})
	public String finalizar() throws Exception {
		addActionMessage(getText("realizar.atendimento.mensagem.finalizar"));
		financeiroServico.finalizarAtendimento();
		return SUCCESS;
	}
	
	@Action(value = "cancelar", results = {
		@Result(name = SUCCESS, params = {"actionName", "atendimento"}, type = "redirectAction")
	})
	public String cancelar() throws Exception {
		addActionMessage(getText("realizar.atendimento.mensagem.cancelar"));
		financeiroServico.cancelarAtendimento();
		return SUCCESS;
	}
	
	@Action(value = "incluirProdutoAtendimento", results = {
		@Result(name = SUCCESS, params = {"actionName", "atendimento"}, type = "redirectAction"),
		@Result(name = FORWARD_ALTERAR_ATENDIMENTO, params = {"actionName", "abrirAlterar", "origem", "${origem}"}, type = "redirectAction") 
	})
	public String incluirProdutoAtendimento() throws Exception {
		if (getOrigem().equals("alterar")) {
			return FORWARD_ALTERAR_ATENDIMENTO;
		}
		//TODO falta
		return SUCCESS;
	}
	
	@Action(value = "excluirProdutoAtendimento", results = {
		@Result(name = SUCCESS, params = {"actionName", "atendimento"}, type = "redirectAction"),
		@Result(name = FORWARD_ALTERAR_ATENDIMENTO, params = {"actionName", "abrirAlterar", "origem", "${origem}"}, type = "redirectAction")
	})
	public String excluirProdutoAtendimento() throws Exception {
		if (getOrigem().equals("alterar")) {
			return FORWARD_ALTERAR_ATENDIMENTO;
		}
		//TODO falta
		return SUCCESS;
	}
	
	@Action(value = "alterarProdutoAtendimento", results = {
		@Result(name = SUCCESS, params = {"actionName", "atendimento"}, type = "redirectAction") ,
		@Result(name = FORWARD_ALTERAR_ATENDIMENTO, params = {"actionName", "abrirAlterar", "origem", "${origem}"}, type = "redirectAction")
	})
	public String alterarProdutoAtendimento() throws Exception {
		if (getOrigem().equals("alterar")) {
			return FORWARD_ALTERAR_ATENDIMENTO;
		}
		financeiroServico.alterarQtdProdutoAtendimento(getProduto(), getAtendimento(), (short) getQuantidade());
		return SUCCESS;
	}
	
	//TODO como faz???
	/*@Action(value = "consultarListaProdutoAtendimento", results = {
			@Result(name = SUCCESS, params = {"actionName", "atendimento"}, type = "redirectAction") ,
			@Result(name = FORWARD_ALTERAR_ATENDIMENTO, params = {"actionName", "abrirAlterar", "origem", "${origem}"}, type = "redirectAction")
		})*/
		
	public String consultarListaProdutoAtendimento() throws Exception {
		setListaProdutoAtendimento(financeiroServico.consultarListaProdutoAtendimento(atendimento));

		if (getListaProdutoAtendimento() == null || getListaProdutoAtendimento().isEmpty()) {
			addActionError(getText("geral.mensagem.consulta.sem.retorno"));
			return INPUT;
		}
		return SUCCESS;
	}
	
	@Action(value = "detalhar", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_ATENDIMENTO + "/detalhar.jsp")
	})
	public String detalhar() throws Exception {
		//TODO falta
		return SUCCESS;
	}

	@Action(value = "abrirAlterar", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_ATENDIMENTO + "/alterar.jsp"),
		@Result(name = INPUT, params = {"actionName", "consultar"}, type = "redirectAction")
	})
	public String abrirAlterar() throws Exception {
		Atendimento atendimentoBD = null;//financeiroServico.getAtendimento(atendimento.getId());
		if (atendimentoBD == null) {
			addActionError(getText("geral.mensagem.get", new String[]{NOME_ENTIDADE_SINGULAR}));
			return INPUT;
		}
		setAtendimento(atendimentoBD);
		return SUCCESS;
	}

	@Action(value = "alterar", results = {
		@Result(name = SUCCESS, params = {"actionName", "listarAtendimentosEmAberto"}, type = "redirectAction") 
	})
	public String alterar() throws Exception {
		//financeiroServico.alterar(getAtendimento());
		return SUCCESS;
	}
	
	@Action(value = "indicarClienteAtendimento", results = {
		@Result(name = SUCCESS, params = {"actionName", "listarAtendimentosEmAberto"}, type = "redirectAction") 
	})
	public String indicarClienteAtendimento() throws Exception {
		financeiroServico.indicarClienteAtendimento(getAtendimento(), getCliente());
		return SUCCESS;
	}

	public Atendimento getAtendimento() {
		return atendimento;
	}

	public void setAtendimento(Atendimento atendimento) {
		this.atendimento = atendimento;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<Atendimento> getResultadoConsulta() {
		return resultadoConsulta;
	}

	public void setResultadoConsulta(List<Atendimento> resultadoConsulta) {
		this.resultadoConsulta = resultadoConsulta;
	}

	public List<Produto> getListaProdutoAtendimento() {
		return listaProdutoAtendimento;
	}

	public void setListaProdutoAtendimento(List<Produto> listaProdutoAtendimento) {
		this.listaProdutoAtendimento = listaProdutoAtendimento;
	}

	public FinanceiroServico getFinanceiroServico() {
		return financeiroServico;
	}

	public void setFinanceiroServico(FinanceiroServico financeiroServico) {
		this.financeiroServico = financeiroServico;
	}

	public int getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(int quantidade) {
		this.quantidade = quantidade;
	}

	public String getOrigem() {
		return origem;
	}

	public void setOrigem(String origem) {
		this.origem = origem;
	}



}